<?php
require_once 'MainPageWidget.php';
require_once 'SectionsManage/FormValidator.php';
require_once 'SectionsManage/SectionsManageFormHandler.php';

/*
 * Новый виджет управления разделами
 *
 * @author 61, lucky
 */
class SectionsManageWidget extends SectionsManageFormHandler {
	public $ajax_functions = array(
		'ajax_getSections',
		'ajax_getSectionDetails',
		'ajax_upSectionsOrder',
		'ajax_handleFormCreate',
		'ajax_handleFormEdit',
		'ajax_rmSection',
		'ajax_getTdiMenu'
	);
	public $ui_frontjs = "widget/sections_loader.js";  // скрипт-загрузчик
	public $main_jsurl; // основной javascript подгружаемый загрузчиком

	/*
	 * Операции которыми может управлять пользователь, с помощью этого класса
	 */
	public $managable_actions = array(
			'item_create' => array(
				'name' => 'item_create',
				'title' => 'Создавать сообщения',
			),
			'item_read' => array(
				'name' => 'item_read',
				'title' => 'Читать сообщения',
			),
			'comment_create' => array(
				'name' => 'comment_create',
				'title' => 'Создавать комментарии',
			),
	);

	private function checkRights() {
		$aa = $this->acl_assistant;
		$cp = $this->ctx->cp;

		$community_oid = $aa->acl_data['comity_oid'];
		$operations = $aa->getAvailableOperations($community_oid);
		if (!$aa->is_granted(array( "tdi_create"))) {
			$cp->set_data(1); // нет прав
			return false;
		}

		return true;
	}

	/*
	 * Получить роли сообщества. С названием и алиасом.
	 *
	 * @return array
	 * @paran $community_oid - идшник сообщества
	 */
	protected function loadCommunityRoles ($community_oid)	{
		// выдернем роли для сообщества
		$community_roles = $this->acl_assistant->getRolesList($community_oid);

		// выдернем все роли
		$roles_ql = 'select objects where role.oid > 0 order by role.level';
		$rs = $this->store->find($roles_ql);
		if ($rs) {
			$roles = array();
			while ($role = $rs->next()) {
				$t = $role->data;
				$t['id'] = $role->id;
				$roles[$role->id] = $t;
			}
		}

		// соберем данные по всем ролям в одни массив
		foreach ($community_roles as $k=>$role) {
			$ro = $roles[$role['id_object']];
			if ($ro['name'] == 'administrator') { // администратору узла права не устанавливаем
				unset($community_roles[$k]);
			} else {
				$community_roles[$k]['title'] = $ro['title'];
				$community_roles[$k]['name'] = $ro['name'];
			}
		}

		return $community_roles;
	} // end of function loadCommunityRoles


	/*
	 * Удаляет раздел.
	 *
	 * @param $oid
	 * @return void
	 */
	public function ajax_rmSection( $oid ) {
		$aa = $this->acl_assistant;
		$cp = $this->ctx->cp;

		$community_oid = $aa->acl_data['comity_oid'];
		if (!$this->checkRights()) return;

		$this->ctx->db->begin();
		$m_sect = $this->ctx->mm->getModel("Tdi");
		$m_sect->delSection($oid);

		// удалим сообщество из acl таблиц
		$aa->delete( $oid );

		if ($this->ctx->db->isErrorInTransaction()) {
			$cp->set_data(2); // ошибка при сохранении в DB
			$this->ctx->db->rollback();
			return;
		}
		$this->ctx->db->end();
		$cp->set_data(0); // все ок

		/*
		 * По идее тут должно быть генерация событий для IdSrv, но С. Цветков (он хороший человек и я его уважаю, но)
		 * сказал не писать.
		 *
		 * А я написал баг http://platonica.ru/trac/ticket/497#preview
		 */
	}

	public function ajax_handleFormCreate( $data ) {
		parse_str($data, $form);
		$cp = $this->ctx->cp;

		if (!$this->checkRights()) return;
		if (!$this->validate($form)) return;
		if (!$this->createSection($form)) return;
		if (!$this->updateAcl($form)) return;

		$cp->set_data(0); // все ок
	}

	public function ajax_handleFormEdit( $oid, $data ) {
		parse_str($data, $form);
		$cp = $this->ctx->cp;
		$this->section_oid = $oid;

		if (!$this->checkRights()) return;
		if (!$this->validate($form)) return;

		if (!$this->updateSection($form)) return;
		if (!$this->updateAcl($form)) return;

		$cp->set_data(0); // все ок
	}


	/*
	 * Обновляет порядок следования разделов друг за другом. Порядок хранится в объекте сообщества.
	 *
	 * @param array $order - одномерный массив из идшников разделов
	 * @return void
	 */
	public function ajax_upSectionsOrder( $order ) {
		if (!$this->checkRights()) return;
		$mcom = $this->ctx->mm->getModel("Community");

		$com = $mcom->getCommunity($this->acl_assistant->acl_data['comity_oid']);
		if ($com instanceof fobject) {
			$com->data['sections_order'] = $order;
			if ($com->save()) {
				$status = 0; // все ок
			}

		} else { $status = 1;	} // нет сообщества
		$this->ctx->cp->set_data($status);
	}

	/*
	 * Соберет xml, с более конкретной информацией о разделе:
	 *  - название, url, тип ленты, умолчательный тип документа, рекомендуемые теги, права
	 *
	 * @param $oid - идшник раздела
	 * @return void
	 */
	public function ajax_getSectionDetails( $oid ) {
		if (!$this->checkRights()) return;
		$mtdi = $this->ctx->mm->getModel("Tdi");
		$sect = $mtdi->getTdi($oid);

		$cp = $this->ctx->cp;
		$section = $cp->add_node("section");
		$section->add_node("title")->set_data($sect->data['title']);
		$section->add_node("url")->set_data($sect->data['url']);
		$section->add_node("feed")->set_data($sect->data['view']);
		$section->add_node("def_doctype")->set_data($sect->data['itype']);
		$section->add_node("tags")->set_data($sect->data['tags']);
		$section->add_node("show_in_main_menu")->set_data($sect->data['show_in_main_menu']);

		$community_oid = $this->acl_assistant->acl_data['comity_oid'];
		$operations = $this->acl_assistant->getAvailableOperations();

		$community_roles = $this->loadCommunityRoles($community_oid);
		$acl_oid = $oid ? $oid : $community_oid;

		$acl = $section->add_node("acl");
		foreach($community_roles as $k=>$role) {

			$an = $acl->add_node("role_acl");
			$an->set_data($role['id_object']);
			$actions = $this->acl_assistant->getAclbyRole($acl_oid, $role['id_object']);
			$managable_actions = array_keys($this->managable_actions);
			foreach ($managable_actions as $alias) {
				$act_node = $an->add_node($alias);
				$act_node->add_node("is_allowed")->set_data($actions[$alias]['is_allowed']);
				if ($actions[$alias]['opt']==0) {
					$act_node->add_node("is_inherited")->set_data(true);
				}
			}
		}

	}

	/*
	 * Соберет xml с данными о разделах: порядковый номер, название, кол-во записей
	 */
	public function ajax_getSections() {
		if (!$this->checkRights()) return;
		$cp = $this->ctx->cp;

		// получить список разделов и отправить XML с ними
		$prefix = $this->ctx->db->db_prefix;
		$sects_list = implode(",", array_keys($this->getSectionsOids()));

		if (strlen($sects_list) == 0) return; // разделов то нету

		$sql = "SELECT DISTINCT `{$prefix}objects`.*, `{$prefix}class_tdi`.color,
		`{$prefix}class_tdi`.url, count(afeed.oid) as items_count
		FROM `{$prefix}class_tdi`
		INNER JOIN `{$prefix}objects` ON store_objects.oid = `{$prefix}class_tdi`.oid
		#INNER JOIN `{$prefix}class_tdi_order` ON `{$prefix}class_tdi_order`.oid=`{$prefix}class_tdi`.oid
		LEFT OUTER JOIN `{$prefix}class_allfeed` afeed ON afeed.tdi_oid = `{$prefix}class_tdi`.oid AND afeed.is_deleted = 0
		WHERE (`{$prefix}class_tdi`.`oid` IN (".$sects_list.") AND `{$prefix}objects`.`is_deleted` = 0)
		GROUP BY `{$prefix}class_tdi`.`oid`
		#ORDER BY `{$prefix}class_tdi_order`.`order` ASC";

		$rs = $this->store->findSQL($sql);
		$sections = array();
		while ($tdi = $rs->next()) {
				$row = $rs->rs->current();
				$sect = array();
				$sect['oid'] = $tdi->id;
				$sect['title'] = $tdi->data['title'];
				$sect['items_cnt'] = $row['items_count'];
				$sect['color'] = $row['color'];
				$sect['url'] = $row['url'];
				$sect['show_in_main_menu'] = $tdi->data['show_in_main_menu'];
				$sections[$tdi->id] = $sect;
			}

		$mcom = $this->ctx->mm->getModel("Community");

		$com = $mcom->getCommunity($this->acl_assistant->acl_data['comity_oid']);
		if ($com instanceof fobject) {

			// установим массив содержащий порядок разделов
			if (	isset($com->data['sections_order']) &&
					(count($com->data['sections_order']) == count($sections))		) {

				$sects_order = $com->data['sections_order'];

			} else {
				$sects_order = array_keys($sections);
			}

			foreach ($sects_order as $num=>$oid) {
				if (!isset($sections[$oid])) continue;
				$sect =  $sections[$oid];

				$section = $cp->add_node("section");
				$section->add_node("num")->set_data($num+1);
				$section->add_node("oid")->set_data($sect['oid']);
				$section->add_node("title")->set_data($sect['title']);
				$section->add_node("items_cnt")->set_data($sect["items_cnt"]);
				$section->add_node("color")->set_data($sect["color"]);
				$section->add_node("url")->set_data($sect["url"]);
				$section->add_node("show_in_main_menu")->set_data($sect["show_in_main_menu"]);
				unset($section);
			}

			$cp->add_node("community_url")->set_data($this->ctx->rh->base_url . $com->data['community_url']);
		} else {
			// сообщество не найдено, тогда и разделов не дадим
		}

	}

	private function getSectionsOids() {
		$community_oid = $this->acl_assistant->acl_data['comity_oid'];
		$tdi_nodes = $this->acl_assistant->getCommunityTdi($community_oid);
		$_tdis = array();
		if (isset($tdi_nodes)) {
			foreach ($tdi_nodes as $tdi_node) {
				$_tdis[$tdi_node['id_object']] = $tdi_node;
			}
		}
		return $_tdis;
	}

	public function Render() {
		$rh = $this->ctx->rh;

		$community_model = $this->ctx->mm->getModel("Community");

		$community = $community_model->getCommunity($this->acl_assistant->acl_data['comity_oid']);

		if ($community instanceof fobject) {
			$community_skin = $community_model->getSkin($community);
		} else {
			$community_skin = $community_model->getDefaultSkin();
		}

		$rh->useClass("RL_URLGenerator");
		$ug = new RL_URLGenerator($rh->router->getRule('resource_link'));
		$ug->setRouter($rh->router);
		$ug->setParams(array(
			"skin_name"=>"common",
			"filepath"=>"js/widget/sections_widget.js"
		));

		$this->main_jsurl = $ug->generateUrl();

		$ug->setParams(array(
			"skin_name"=>$community_skin,
			"filepath"=>"images"
		));
		$this->images_url = $ug->generateUrl();

		$ug = new RL_URLGenerator($rh->router->getRule('jtpl_handler'));
		$ug->setRouter($rh->router);
		$ug->setParams(array(
			"community_url"=>$community->data['community_url'],
			"template" => ""
		));
		$this->tpl_url = $ug->generateUrl();

	}

	public function ajax_getTdiMenu() {
		$cp = $this->ctx->cp->set_data('qwe');
	}
}

?>
